{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "env: PYTORCH_ENABLE_MPS_FALLBACK=1\n"
     ]
    }
   ],
   "source": [
    "%set_env PYTORCH_ENABLE_MPS_FALLBACK=1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from datasetsforecast.long_horizon import LongHorizon\n",
    "\n",
    "from neuralforecast.core import NeuralForecast\n",
    "from neuralforecast.losses.pytorch import MAE, MSE\n",
    "from neuralforecast.models import TSMixer, PatchTST, iTransformer, RMoK\n",
    "\n",
    "from utilsforecast.losses import mae, mse, smape\n",
    "from utilsforecast.evaluation import evaluate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_data(name):\n",
    "    if name == 'Ettm1':\n",
    "        Y_df, *_ = LongHorizon.load(directory='./', group='ETTm1')\n",
    "        Y_df['ds'] = pd.to_datetime(Y_df['ds'])\n",
    "        freq = '15T'\n",
    "        h = 96\n",
    "        val_size = 11520\n",
    "        test_size = 11520\n",
    "    elif name == 'Ettm2':\n",
    "        Y_df, *_ = LongHorizon.load(directory='./', group='ETTm2')\n",
    "        Y_df['ds'] = pd.to_datetime(Y_df['ds'])\n",
    "        freq = '15T'\n",
    "        h = 96\n",
    "        val_size = 11520\n",
    "        test_size = 11520\n",
    "\n",
    "    return Y_df, h, val_size, test_size, freq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:torch.distributed.nn.jit.instantiator:Created a temporary directory at /var/folders/g1/xrd363zx571_wq54f3htnbxr0000gn/T/tmptz6bmutb\n",
      "INFO:torch.distributed.nn.jit.instantiator:Writing /var/folders/g1/xrd363zx571_wq54f3htnbxr0000gn/T/tmptz6bmutb/_remote_module_non_scriptable.py\n",
      "INFO:lightning_fabric.utilities.seed:Seed set to 1\n",
      "INFO:lightning_fabric.utilities.seed:Seed set to 1\n",
      "INFO:lightning_fabric.utilities.seed:Seed set to 1\n",
      "INFO:lightning_fabric.utilities.seed:Seed set to 1\n",
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n",
      "INFO:pytorch_lightning.callbacks.model_summary:\n",
      "  | Name    | Type          | Params\n",
      "------------------------------------------\n",
      "0 | loss    | MAE           | 0     \n",
      "1 | padder  | ConstantPad1d | 0     \n",
      "2 | scaler  | TemporalNorm  | 0     \n",
      "3 | dropout | Dropout       | 0     \n",
      "4 | gate    | Linear        | 388   \n",
      "5 | softmax | Softmax       | 0     \n",
      "6 | experts | ModuleList    | 138 K \n",
      "7 | rev     | RevIN         | 14    \n",
      "------------------------------------------\n",
      "139 K     Trainable params\n",
      "0         Non-trainable params\n",
      "139 K     Total params\n",
      "0.556     Total estimated model params size (MB)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "141d2d057b504bdcb6d170f8ba1a1d3b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Sanity Checking: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9a230f398fae40cc82694bc4cce74dc0",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Training: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "warning: loc(\"mps_not_equal\"(\"(mpsFileLoc): /AppleInternal/Library/BuildRoots/4ff29661-3588-11ef-9513-e2437461156c/Library/Caches/com.apple.xbs/Sources/MetalPerformanceShadersGraph/mpsgraph/MetalPerformanceShadersGraph/Core/Files/MPSGraphUtilities.mm\":253:0)): 'anec.not_equal_zero' op Invalid configuration for the following reasons: Tensor dimensions N1D1C1H1W34465 are not within supported range, N[1-65536]D[1-16384]C[1-65536]H[1-16384]W[1-16384].\n",
      "warning: loc(\"mps_select\"(\"(mpsFileLoc): /AppleInternal/Library/BuildRoots/4ff29661-3588-11ef-9513-e2437461156c/Library/Caches/com.apple.xbs/Sources/MetalPerformanceShadersGraph/mpsgraph/MetalPerformanceShadersGraph/Core/Files/MPSGraphUtilities.mm\":294:0)): 'anec.not_equal_zero' op Invalid configuration for the following reasons: Tensor dimensions N1D1C1H1W34465 are not within supported range, N[1-65536]D[1-16384]C[1-65536]H[1-16384]W[1-16384].\n",
      "/Users/marcopeix/miniconda3/envs/neuralforecast/lib/python3.10/site-packages/torch/autograd/__init__.py:200: UserWarning: The operator 'aten::sgn.out' is not currently supported on the MPS backend and will fall back to run on the CPU. This may have performance implications. (Triggered internally at /Users/runner/work/pytorch/pytorch/pytorch/aten/src/ATen/mps/MPSFallback.mm:11.)\n",
      "  Variable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "21a58f2417af464dba0a5e81bc3ec639",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f89867f8d52748409487f8bca78524e5",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "48884126bab7411eb5f353918541e29e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "7b598d3867834074b3b0f4413bc8b563",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3d185212a1fe47cdb21dac3ae64d8557",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0ab19e2b534246df9b1a1bd1c5bc9e5f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "374c69b95b914d88a86e6cc8a58205dd",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "435df3513e084acca43d28aab094272b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9776a25d3055458baa02af6cdcca1af8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d7d330e84e0546009d1c42bd6273e5a3",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: `Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:`Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO: Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9bd895e76c4c49daaa9778f28596dda1",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Predicting: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n",
      "INFO:pytorch_lightning.callbacks.model_summary:\n",
      "  | Name         | Type              | Params\n",
      "---------------------------------------------------\n",
      "0 | loss         | MAE               | 0     \n",
      "1 | padder_train | ConstantPad1d     | 0     \n",
      "2 | scaler       | TemporalNorm      | 0     \n",
      "3 | model        | PatchTST_backbone | 47.8 K\n",
      "---------------------------------------------------\n",
      "47.8 K    Trainable params\n",
      "3         Non-trainable params\n",
      "47.8 K    Total params\n",
      "0.191     Total estimated model params size (MB)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "93e325078cc24164b1de4c1454536b9f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Sanity Checking: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/marcopeix/dev/neuralforecast/neuralforecast/common/_base_windows.py:325: UserWarning: MPS: no support for int64 repeats mask, casting it to int32 (Triggered internally at /Users/runner/work/pytorch/pytorch/pytorch/aten/src/ATen/native/mps/operations/Repeat.mm:236.)\n",
      "  y_scale = torch.repeat_interleave(y_scale, repeats=y_hat.shape[-1], dim=-1).to(\n",
      "/Users/marcopeix/dev/neuralforecast/neuralforecast/common/_base_windows.py:546: UserWarning: MPS: no support for int64 reduction ops, casting it to int32 (Triggered internally at /Users/runner/work/pytorch/pytorch/pytorch/aten/src/ATen/native/mps/operations/ReduceOps.mm:144.)\n",
      "  batch_size = torch.sum(batch_sizes)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d9ea9f11325241ceaa799abe36f426b0",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Training: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "warning: loc(\"mps_not_equal\"(\"(mpsFileLoc): /AppleInternal/Library/BuildRoots/4ff29661-3588-11ef-9513-e2437461156c/Library/Caches/com.apple.xbs/Sources/MetalPerformanceShadersGraph/mpsgraph/MetalPerformanceShadersGraph/Core/Files/MPSGraphUtilities.mm\":253:0)): 'anec.not_equal_zero' op Invalid configuration for the following reasons: Tensor dimensions N1D1C1H1W241255 are not within supported range, N[1-65536]D[1-16384]C[1-65536]H[1-16384]W[1-16384].\n",
      "warning: loc(\"mps_select\"(\"(mpsFileLoc): /AppleInternal/Library/BuildRoots/4ff29661-3588-11ef-9513-e2437461156c/Library/Caches/com.apple.xbs/Sources/MetalPerformanceShadersGraph/mpsgraph/MetalPerformanceShadersGraph/Core/Files/MPSGraphUtilities.mm\":294:0)): 'anec.not_equal_zero' op Invalid configuration for the following reasons: Tensor dimensions N1D1C1H1W241255 are not within supported range, N[1-65536]D[1-16384]C[1-65536]H[1-16384]W[1-16384].\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "80f276746a8442cabdfe7e9caf74e186",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "aebfd8d7f2d54023a4274533a456b78c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b813683bc1fe459c8a86e709fbc43cbc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2ccfe87f74f44d3a85608bb728db10a8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d93fadf468ce4938a14017812305fee6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2afa11bdd1ec4f478f6a11cb0e703ef2",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1cebc995b3924f839eee614745c08868",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "58674ee616b445a483eb4e20d7f67253",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "44cc63153d984082af32a7c80a300b26",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a793504dfd0647e6897ebcfaf9f89800",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: `Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:`Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO: Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0ba86dedf54c407ca9524f3a96ebc7ab",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Predicting: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n",
      "INFO:pytorch_lightning.callbacks.model_summary:\n",
      "  | Name          | Type                   | Params\n",
      "---------------------------------------------------------\n",
      "0 | loss          | MAE                    | 0     \n",
      "1 | padder        | ConstantPad1d          | 0     \n",
      "2 | scaler        | TemporalNorm           | 0     \n",
      "3 | enc_embedding | DataEmbedding_inverted | 12.4 K\n",
      "4 | encoder       | TransEncoder           | 199 K \n",
      "5 | projector     | Linear                 | 12.4 K\n",
      "---------------------------------------------------------\n",
      "224 K     Trainable params\n",
      "0         Non-trainable params\n",
      "224 K     Total params\n",
      "0.897     Total estimated model params size (MB)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ecf93e458acd44afb730cb6ed4d4ab57",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Sanity Checking: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1fabe6baba5f45218078c180197e1d24",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Training: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "675902f3f07e4b2980801e71021e6ce1",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "26a4e8a6a970476292678afd92902972",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6ea99e7a882c489a86000c334d818669",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9e47b685fa9b4177b740d04d28f1c60d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a64d237378ca4179bca324b1fcfa0295",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Predicting: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n",
      "INFO:pytorch_lightning.callbacks.model_summary:\n",
      "  | Name          | Type                     | Params\n",
      "-----------------------------------------------------------\n",
      "0 | loss          | MAE                      | 0     \n",
      "1 | padder        | ConstantPad1d            | 0     \n",
      "2 | scaler        | TemporalNorm             | 0     \n",
      "3 | norm          | ReversibleInstanceNorm1d | 14    \n",
      "4 | mixing_layers | Sequential               | 25.9 K\n",
      "5 | out           | Linear                   | 9.3 K \n",
      "-----------------------------------------------------------\n",
      "35.3 K    Trainable params\n",
      "0         Non-trainable params\n",
      "35.3 K    Total params\n",
      "0.141     Total estimated model params size (MB)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "811aec628aa542ae887f6da1a53a60df",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Sanity Checking: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2d076ab1faa346098fdbba97cdf8b89f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Training: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d1049f7b903240c8958ca80df78d2e78",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "cccf2b27b2f84b4c8c567ee2a9424241",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8d8fdd4d67c248c4bf195f0334f05655",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4b07887aa6504dc6825f430b72e01723",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4e184f5af8d84696bbb78b1384be8ad8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f156972e538a482b9ca62646fa633c04",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d20751e8901e4464961a73a3718e1f6f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9ab3dac6a14d4bb59e08fa82b1430bfd",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "77642f5d04ad4ab8a55529801c9dcb9e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "367f616740664166af7b92f5c7f362bc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: `Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:`Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO: Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "96dd5fadafdf4558834b98a7cfb5f079",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Predicting: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/marcopeix/dev/neuralforecast/neuralforecast/core.py:210: FutureWarning: In a future version the predictions will have the id as a column. You can set the `NIXTLA_ID_AS_COL` environment variable to adopt the new behavior and to suppress this warning.\n",
      "  warnings.warn(\n",
      "INFO:lightning_fabric.utilities.seed:Seed set to 1\n",
      "INFO:lightning_fabric.utilities.seed:Seed set to 1\n",
      "INFO:lightning_fabric.utilities.seed:Seed set to 1\n",
      "INFO:lightning_fabric.utilities.seed:Seed set to 1\n",
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n",
      "INFO:pytorch_lightning.callbacks.model_summary:\n",
      "  | Name    | Type          | Params\n",
      "------------------------------------------\n",
      "0 | loss    | MAE           | 0     \n",
      "1 | padder  | ConstantPad1d | 0     \n",
      "2 | scaler  | TemporalNorm  | 0     \n",
      "3 | dropout | Dropout       | 0     \n",
      "4 | gate    | Linear        | 388   \n",
      "5 | softmax | Softmax       | 0     \n",
      "6 | experts | ModuleList    | 138 K \n",
      "7 | rev     | RevIN         | 14    \n",
      "------------------------------------------\n",
      "139 K     Trainable params\n",
      "0         Non-trainable params\n",
      "139 K     Total params\n",
      "0.556     Total estimated model params size (MB)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b856bca3b46e4e8b908d46058e82d277",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Sanity Checking: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "21d5ca4cb11143898eb9dcd344699a42",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Training: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2fe6da3ed4514a0d81da250c3ea07f05",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3ff52bb68e2a454997bd3f0c5d33a78b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d3ef6533c4b6461d9e92d4d1a8955b78",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a05c2c8464484bb89c24565016641f7a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6e8080c540cd44ce978c9f05da04f6cf",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2080ed2ae2484029bacbeabdaaf29dd4",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e4f31eadb2ea432aa06606964262f597",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "70d0849ae6e04c32be2b0a6c2626e571",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a2dc3df7ab374bbb9835255acb5ac1cc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "66d65c0703064655b1c294a49b9e8dd7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: `Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:`Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO: Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a07cbc38a09c48b890f89710146d7133",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Predicting: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n",
      "INFO:pytorch_lightning.callbacks.model_summary:\n",
      "  | Name         | Type              | Params\n",
      "---------------------------------------------------\n",
      "0 | loss         | MAE               | 0     \n",
      "1 | padder_train | ConstantPad1d     | 0     \n",
      "2 | scaler       | TemporalNorm      | 0     \n",
      "3 | model        | PatchTST_backbone | 47.8 K\n",
      "---------------------------------------------------\n",
      "47.8 K    Trainable params\n",
      "3         Non-trainable params\n",
      "47.8 K    Total params\n",
      "0.191     Total estimated model params size (MB)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3ed3747fe5774f6799b124dc94415111",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Sanity Checking: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5e29ddff4495419cb67d77fd0839da39",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Training: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "52cb0354cd1a4329956b864fa954c7bc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0b6b81809dbe430bb3790e80a82f6a54",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "83c24e8bd9924e03b007ca0bae4eb0eb",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "76cceaaac3aa420ba8ae31a669e52c06",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "868d879d93ee433fa7b403aaf1c79984",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "54ce0425e3fe4133ade0edea7914844e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f47d0650376f4935ae78e5b1f5e81d41",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "06cb596a7b504e5b8533190b18aca5bb",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "22d0a678e308472aa8a34300ff7e57c2",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "70666c13587e495fa9e936bc9203758f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: `Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:`Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO: Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "834eef638f4e4349bb59d429ea98375b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Predicting: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n",
      "INFO:pytorch_lightning.callbacks.model_summary:\n",
      "  | Name          | Type                   | Params\n",
      "---------------------------------------------------------\n",
      "0 | loss          | MAE                    | 0     \n",
      "1 | padder        | ConstantPad1d          | 0     \n",
      "2 | scaler        | TemporalNorm           | 0     \n",
      "3 | enc_embedding | DataEmbedding_inverted | 12.4 K\n",
      "4 | encoder       | TransEncoder           | 199 K \n",
      "5 | projector     | Linear                 | 12.4 K\n",
      "---------------------------------------------------------\n",
      "224 K     Trainable params\n",
      "0         Non-trainable params\n",
      "224 K     Total params\n",
      "0.897     Total estimated model params size (MB)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "454119287bca43ed85adcd92b86b676f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Sanity Checking: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9d222762aaa5463ba4b6192eb40dfe2c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Training: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e46752eeb8c9456ab30fc2518365e3bd",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "27179717fbdf4432b0e144cd22e6d091",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3c941c397c8d499baad0881bd64d7967",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4ace69caa2bf4daaba597da39248033d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "091e45dfe81a45d08d148def41b71f5d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Predicting: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n",
      "INFO:pytorch_lightning.callbacks.model_summary:\n",
      "  | Name          | Type                     | Params\n",
      "-----------------------------------------------------------\n",
      "0 | loss          | MAE                      | 0     \n",
      "1 | padder        | ConstantPad1d            | 0     \n",
      "2 | scaler        | TemporalNorm             | 0     \n",
      "3 | norm          | ReversibleInstanceNorm1d | 14    \n",
      "4 | mixing_layers | Sequential               | 25.9 K\n",
      "5 | out           | Linear                   | 9.3 K \n",
      "-----------------------------------------------------------\n",
      "35.3 K    Trainable params\n",
      "0         Non-trainable params\n",
      "35.3 K    Total params\n",
      "0.141     Total estimated model params size (MB)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0645a353c9dd465bbc9e4fc9d440bd40",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Sanity Checking: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8e3a61bec1804717be72ee9114c0b94b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Training: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c825d1ef36e5475c986f7e5bcc7110fc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e2ad49227b93456ca0eaa1c2268968d2",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c44984dfa1e44640b1ae5e6602787c8b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6969a04d4afd45b395e329a1edbb8636",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "7ce1c4fda3004a0083ba05e65038fb83",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "26d8d6817cf446a893b2c55008756df7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "299acdd1dce74fe0aac906b16a9c9a6e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2a5ab501ae794ec7aba5da7628e8fef7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2cbe0ee82ba2458f8e82feb54d042deb",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b712eb8f35ad474693e54d05c60a0cc6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Validation: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO: `Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:`Trainer.fit` stopped: `max_steps=1000` reached.\n",
      "INFO: Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO:lightning.pytorch.utilities.rank_zero:Trainer already configured with model summary callbacks: [<class 'pytorch_lightning.callbacks.model_summary.ModelSummary'>]. Skipping setting a default `ModelSummary` callback.\n",
      "INFO: GPU available: True (mps), used: True\n",
      "INFO:lightning.pytorch.utilities.rank_zero:GPU available: True (mps), used: True\n",
      "INFO: TPU available: False, using: 0 TPU cores\n",
      "INFO:lightning.pytorch.utilities.rank_zero:TPU available: False, using: 0 TPU cores\n",
      "INFO: IPU available: False, using: 0 IPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:IPU available: False, using: 0 IPUs\n",
      "INFO: HPU available: False, using: 0 HPUs\n",
      "INFO:lightning.pytorch.utilities.rank_zero:HPU available: False, using: 0 HPUs\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "92e8adea2b1b4a44ae85cdb4dbbaf595",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Predicting: |          | 0/? [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/marcopeix/dev/neuralforecast/neuralforecast/core.py:210: FutureWarning: In a future version the predictions will have the id as a column. You can set the `NIXTLA_ID_AS_COL` environment variable to adopt the new behavior and to suppress this warning.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "DATASETS = ['Ettm1', 'Ettm2']\n",
    "\n",
    "for dataset in DATASETS:\n",
    "\n",
    "    Y_df, horizon, val_size, test_size, freq = load_data(dataset)\n",
    "\n",
    "    rmok_model = RMoK(input_size=horizon,\n",
    "                      h=horizon, \n",
    "                      n_series=7,\n",
    "                      num_experts=4,\n",
    "                      dropout=0.1,\n",
    "                      revine_affine=True,\n",
    "                      learning_rate=0.001,\n",
    "                      scaler_type='identity',\n",
    "                      max_steps=1000,\n",
    "                      early_stop_patience_steps=5)\n",
    "    \n",
    "    patchtst_model = PatchTST(input_size=horizon, \n",
    "                              h=horizon, \n",
    "                              encoder_layers=3,\n",
    "                              n_heads=4,\n",
    "                              hidden_size=16,\n",
    "                              dropout=0.3,\n",
    "                              patch_len=16,\n",
    "                              stride=8,\n",
    "                              scaler_type='identity', \n",
    "                              max_steps=1000, \n",
    "                              early_stop_patience_steps=5)\n",
    "    \n",
    "    iTransformer_model = iTransformer(input_size=horizon, \n",
    "                                      h=horizon, \n",
    "                                      n_series=7,\n",
    "                                      e_layers=2,\n",
    "                                      hidden_size=128,\n",
    "                                      d_ff=128,\n",
    "                                      scaler_type='identity', \n",
    "                                      max_steps=1000, \n",
    "                                      early_stop_patience_steps=3)\n",
    "    \n",
    "    tsmixer_model = TSMixer(input_size=horizon,\n",
    "                            h=horizon,\n",
    "                            n_series=7,\n",
    "                            n_block=2,\n",
    "                            dropout=0.9,\n",
    "                            ff_dim=64,\n",
    "                            learning_rate=0.001,\n",
    "                            scaler_type='identity',\n",
    "                            max_steps=1000,\n",
    "                            early_stop_patience_steps=5)\n",
    "\n",
    "    models = [rmok_model, patchtst_model, iTransformer_model, tsmixer_model]\n",
    "\n",
    "    nf = NeuralForecast(models=models, freq=freq)\n",
    "\n",
    "    nf_preds = nf.cross_validation(df=Y_df, val_size=val_size, test_size=test_size, n_windows=None)\n",
    "    nf_preds = nf_preds.reset_index()\n",
    "\n",
    "    evaluation = evaluate(df=nf_preds, metrics=[mae, mse], models=['RMoK', 'PatchTST', 'iTransformer', 'TSMixer'])\n",
    "    evaluation.to_csv(f'{dataset}_results.csv', index=False, header=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>metric</th>\n",
       "      <th>RMoK</th>\n",
       "      <th>PatchTST</th>\n",
       "      <th>iTransformer</th>\n",
       "      <th>TSMixer</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>mae</td>\n",
       "      <td>0.355311</td>\n",
       "      <td>0.365640</td>\n",
       "      <td>0.513339</td>\n",
       "      <td>0.351254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mse</td>\n",
       "      <td>0.330235</td>\n",
       "      <td>0.347774</td>\n",
       "      <td>0.625772</td>\n",
       "      <td>0.333395</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  metric      RMoK  PatchTST  iTransformer   TSMixer\n",
       "0    mae  0.355311  0.365640      0.513339  0.351254\n",
       "1    mse  0.330235  0.347774      0.625772  0.333395"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ettm1_eval = pd.read_csv('Ettm1_results.csv')\n",
    "ettm1_eval = ettm1_eval.drop(['unique_id'], axis=1).groupby('metric').mean().reset_index()\n",
    "ettm1_eval"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>metric</th>\n",
       "      <th>RMoK</th>\n",
       "      <th>PatchTST</th>\n",
       "      <th>iTransformer</th>\n",
       "      <th>TSMixer</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>mae</td>\n",
       "      <td>0.256462</td>\n",
       "      <td>0.258884</td>\n",
       "      <td>0.297765</td>\n",
       "      <td>0.257037</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mse</td>\n",
       "      <td>0.178422</td>\n",
       "      <td>0.180819</td>\n",
       "      <td>0.221797</td>\n",
       "      <td>0.182780</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  metric      RMoK  PatchTST  iTransformer   TSMixer\n",
       "0    mae  0.256462  0.258884      0.297765  0.257037\n",
       "1    mse  0.178422  0.180819      0.221797  0.182780"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ettm2_eval = pd.read_csv('Ettm2_results.csv')\n",
    "ettm2_eval = ettm2_eval.drop(['unique_id'], axis=1).groupby('metric').mean().reset_index()\n",
    "ettm2_eval"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABrbklEQVR4nO3de3zP9f//8fvb2MFmIzLDTg4xp2IT4+sUNkvS6UM5n8qa8z4dLGcKISbZHDJzKOmTw08lWkoRCm2fwpJjKzaiGMrG9vr94ev99fYeZub1xm7Xy+V9ufR6vp6v1+vxeuPVdn8/n8+3xTAMQwAAAAAAAICJijm6AAAAAAAAABQ9hFIAAAAAAAAwHaEUAAAAAAAATEcoBQAAAAAAANMRSgEAAAAAAMB0hFIAAAAAAAAwHaEUAAAAAAAATEcoBQAAAAAAANMRSgEAAAAAAMB0hFIAADhAYmKiLBaLLBaLNm7caLffMAxVq1ZNFotFLVu2zPMcJ06ckIuLiywWi3bs2JFnn169elmvk9frTrFx48ZrvhdXupX37eTJk4qJiVGtWrXk7u4uLy8v1axZU927d9ePP/6Y5zXyet2oRkkaOXKk/Pz8VLx4cZUuXfrGb8AtGDt2rE19JUuWVOXKlRUeHq5Zs2bpzJkzdsf06tVLAQEBNm1//vmnnn32WZUvX14Wi0VPPPGEJOnw4cNq37697rvvPlksFg0dOvS23s+teP/99xUbG5vv/i1btpTFYlGVKlVkGIbd/m+++cb6viYmJhZanZf/jh0+fPimj7385w0AwL2guKMLAACgKCtVqpQWLFhgF6B8/fXXOnDggEqVKnXNY5csWaLs7GxJ0oIFCxQSEpJnPzc3N3355ZeFVvOd4Gbft7Nnz6px48Y6e/asXn75ZT344IP6559/9Msvv2jlypVKSUlRvXr1bI5ZuHChatasaXftWrVqXbe2//f//p/eeOMNjRgxQhEREXJxcSnYTd6kdevWycvLS9nZ2Tp69Kg2bNigV155RVOnTtXHH3+sBx980Np31KhRGjJkiM3xEyZM0KpVq5SQkKCqVavqvvvukyQNGzZM3333nRISElShQgX5+PiYcj8F8f7772vXrl03FZyVKlVKhw4d0pdffqnWrVvb7EtISJCnp6cyMzMLuVIAACARSgEA4FCdO3fWe++9p9mzZ8vT09PavmDBAoWGhl73l+GEhASVL19e/v7+WrZsmaZPny43Nze7fsWKFVPjxo1vS/2OcrPv23/+8x/t379fX375pVq1amWzLzo6Wrm5uXbXqFOnzjWDvuvZtWuXJGnw4MEqX778TR+fl7///lslS5a8bp/g4GCVK1fOuv3ss89q4MCBatGihR5//HH98ssv1oCsatWqedZdtWpVde3a1a794Ycfto6culWGYej8+fN5/l11BD8/P5UqVUoJCQk2odSZM2f0n//8R127dtX8+fMdWCEAAPcupu8BAOBAzz33nCRp2bJl1rbTp09rxYoV6tOnzzWP++6777Rr1y51795dzz//vPWYwjZ79mw1b95c5cuXl7u7u+rWraspU6bowoULNv1atmypOnXqaPv27WrWrJlKliypKlWqaPLkyXaBz88//6x27dqpZMmSKleunCIjI/OcYnY9N/u+nTx5UpKuOcqnWLHC+ZEoICBAI0eOlCR5e3vLYrFo7NixkqTc3FxNmTJFNWvWlIuLi8qXL68ePXro999/tznH5ffym2++UZMmTVSyZMnr/l24ngcffFAjRoxQWlqali9fbm2/cvre4cOHZbFY9MUXXyg1NdVmmqLFYtH+/fv12WefWdsvTznLzMzUSy+9pMDAQDk7O6tSpUoaOnSozp07Z1ODxWLRwIEDNWfOHAUFBcnFxUWLFi2SJO3bt09dunRR+fLl5eLioqCgIM2ePdvm+Mt1LFu2TCNGjFDFihXl6empNm3aaO/evTbv26effqpff/31pqeo9unTRytXrtSpU6esbR988IGkS+FeXjZv3qzWrVurVKlSKlmypJo0aaJPP/3Urt+2bdvUtGlTubq6qmLFioqJibH793PZ8uXLFRoaKnd3d3l4eCg8PFzJyck3rP/LL79Uy5YtVbZsWbm5ucnPz09PP/20/v7773zcPQAAjkMoBQCAA3l6euqZZ55RQkKCtW3ZsmUqVqyYOnfufM3jFixYIOnSL9PPPvusSpYsaW3Ly8WLF+1eeY0OutqBAwfUpUsXLVmyRJ988on69u2rqVOnqn///nZ9MzIy1LVrV3Xr1k1r1qxRRESEYmJitHTpUmufY8eOqUWLFtq1a5fi4uK0ZMkSnT17VgMHDrxhLVe62fctNDRUktSjRw+tXr3aGlJdT05Ojt17lpOTc91jVq1apb59+0q6NJ1u69at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Zqh58+aqU6eORo0apeeff94uXAfgGDNmzFCZMmXUpEkTdejQQeHh4df9hqu8eHh46M0331RISIgaNmyow4cPa+3atdcchVSQn0tuRXh4uD755BMlJSWpYcOGaty4saZPny5/f//bcj0A9h5++GGdPXtWkZGRql27tlq0aKFt27Zp9erVatGiRZ7HODs7q1y5cnlO973aH3/8ob59+2rs2LHWZ9iYMWNUsWJFRUZGSpL69eund999V4mJiapbt65atGihxMRERkrhuiyGYRiOLgIAAAAAAABFCyOlAAAAAAAAYDpCKQAAAAAAAJiOUAoAAAAAAACmI5QCAAAAAACA6QilAAAAAAAAYDpCKQAAAAAAAJiOUAoAAAAAAACmI5QCAAAAAACA6QilAAAA7hIbN26UxWLRqVOn8n1MQECAYmNjb1tNAAAABUUoBQAAUEh69eoli8WiyMhIu31RUVGyWCzq1auX+YUBAADcgQilAAAACpGvr68++OAD/fPPP9a28+fPa9myZfLz83NgZQAAAHcWQikAAIBC1KBBA/n5+WnlypXWtpUrV8rX11f169e3tmVlZWnw4MEqX768XF1d9T//8z/avn27zbnWrl2rBx54QG5ubmrVqpUOHz5sd70tW7aoefPmcnNzk6+vrwYPHqxz585ds76xY8fKz89PLi4uqlixogYPHnzrNw0AAFAAhFIAAACFrHfv3lq4cKF1OyEhQX369LHp88orr2jFihVatGiRfvjhB1WrVk3h4eH6888/JUm//fabnnrqKT366KNKSUlRv379NHz4cJtz/PTTTwoPD9dTTz2lH3/8UcuXL9fmzZs1cODAPOv66KOPNGPGDM2dO1f79u3T6tWrVbdu3UK+ewAAgPwhlAIAAChk3bt31+bNm3X48GH9+uuv+vbbb9WtWzfr/nPnzik+Pl5Tp05VRESEatWqpfnz58vNzU0LFiyQJMXHx6tKlSqaMWOGatSooa5du9qtRzV16lR16dJFQ4cOVfXq1dWkSRO9/fbbWrx4sc6fP29XV1pamipUqKA2bdrIz89PDz/8sJ5//vnb+l4AAABcC6EUAABAIStXrpzat2+vRYsWaeHChWrfvr3KlStn3X/gwAFduHBBTZs2tbaVKFFCDz/8sFJTUyVJqampaty4sSwWi7VPaGiozXV27typxMREeXh4WF/h4eHKzc3VoUOH7Or617/+pX/++UdVqlTR888/r1WrVunixYuFffsAAAD5UtzRBQAAANyL+vTpY51GN3v2bJt9hmFIkk3gdLn9ctvlPteTm5ur/v3757kuVF6Lqvv6+mrv3r1KSkrSF198oaioKE2dOlVff/21SpQokb8bAwAAKCSMlAIAALgN2rVrp+zsbGVnZys8PNxmX7Vq1eTs7KzNmzdb2y5cuKAdO3YoKChIklSrVi1t27bN5rirtxs0aKDdu3erWrVqdi9nZ+c863Jzc9Pjjz+ut99+Wxs3btTWrVv1008/FcYtAwAA3BRGSgEAANwGTk5O1ql4Tk5ONvvc3d314osv6uWXX9Z9990nPz8/TZkyRX///bf69u0rSYqMjNRbb72l6Oho9e/f3zpV70qvvvqqGjdurAEDBuj555+Xu7u7UlNTlZSUpFmzZtnVlJiYqJycHDVq1EglS5bUkiVL5ObmJn9//9vzJgAAAFwHI6UAAABuE09PT3l6eua5b/LkyXr66afVvXt3NWjQQPv379f69etVpkwZSZem361YsUIff/yxHnzwQc2ZM0cTJ060OUe9evX09ddfa9++fWrWrJnq16+vUaNGycfHJ89rli5dWvPnz1fTpk1Vr149bdiwQR9//LHKli1buDcOAACQDxYjPwsWAAAAAAAAAIWIkVIAAAAAAAAwHaEUAAAAAAAATEcoBQAAAAAAANMRSgEAAAAAAMB0hFIAAAAAAAAwHaEUAAAAAAAATEcoBQAAAAAAANMRSgEAAAAAAMB0hFIAAAAAAAAwHaEUAAAAAAAATEcoBQAAAAAAANMRSgEAAAAAAMB0/x/Zv5sbmy0w3wAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(12, 6))\n",
    "\n",
    "# Define bar width and positions\n",
    "bar_width = 0.35\n",
    "r1 = np.arange(len(ettm1_eval.columns) - 1)\n",
    "r2 = [x + bar_width for x in r1]\n",
    "\n",
    "# Create bars\n",
    "mae_bars = ax.bar(r1, ettm1_eval.iloc[0, 1:], color='skyblue', width=bar_width, label='MAE')\n",
    "mse_bars = ax.bar(r2, ettm1_eval.iloc[1, 1:], color='lightgreen', width=bar_width, label='MSE')\n",
    "\n",
    "# Add value labels on top of bars\n",
    "def add_value_labels(bars):\n",
    "    for bar in bars:\n",
    "        height = bar.get_height()\n",
    "        ax.text(bar.get_x() + bar.get_width()/2., height,\n",
    "                f'{height:.3f}',\n",
    "                ha='center', va='bottom')\n",
    "\n",
    "add_value_labels(mae_bars)\n",
    "add_value_labels(mse_bars)\n",
    "\n",
    "# Customize the plot\n",
    "ax.set_xlabel('Models')\n",
    "ax.set_ylabel('Error')\n",
    "ax.set_title('MAE and MSE for Different Models')\n",
    "ax.set_xticks([r + bar_width/2 for r in range(len(ettm1_eval.columns) - 1)])\n",
    "ax.set_xticklabels(ettm1_eval.columns[1:])\n",
    "ax.legend()\n",
    "\n",
    "# Adjust layout and display the plot\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABtKklEQVR4nO3deVxV1f7/8fcRZVAEZ9AEHEtwSnFCw6EENTPtWlImzpWhOXBvJTnrVdJKUa9zImpXxHsd61qGldNXsjSwLCsrja5BpiWohQrs3x/+ONfjAQWEfRxez8fjPB6dtT977bWOusO3a69jMQzDEAAAAAAAAGCiMo4eAAAAAAAAAO4+hFIAAAAAAAAwHaEUAAAAAAAATEcoBQAAAAAAANMRSgEAAAAAAMB0hFIAAAAAAAAwHaEUAAAAAAAATEcoBQAAAAAAANMRSgEAAAAAAMB0hFIAANwC4uLiZLFYZLFYtGvXLrvjhmGoQYMGslgs6ty5c759nD59Wi4uLrJYLDp48GC+NYMHD7ZeJ7/XrWLXrl0FfhZXu5nP7cyZM4qKilJAQIAqVKggT09PNWrUSOHh4fr888/zvUZ+rxuNUZImTpwoX19flS1bVpUqVbrxB3ATpk6dajO+8uXLq3bt2urWrZsWLlyoc+fO2Z0zePBg1alTx6btt99+05NPPqkaNWrIYrGoT58+kqQTJ06oZ8+eqlKliiwWi8aOHVuq87kZ69atU0xMTKHrO3fuLIvFonr16skwDLvje/bssX6ucXFxJTbOvN9jJ06cKPK5eb/eAADcjso6egAAAOB/KlasqJUrV9oFKLt379b333+vihUrFnju2rVrdenSJUnSypUr1apVq3zr3Nzc9OGHH5bYmG8FRf3czp8/r3bt2un8+fN68cUX1bx5c/3555/69ttvtWnTJqWkpKhZs2Y256xatUqNGjWyu3ZAQMB1x7Z161bNnDlTEyZMUI8ePeTi4lK8SRbRe++9J09PT126dEk///yzPvjgA7300kt67bXX9Pbbb6t58+bW2kmTJmnMmDE258+YMUObN29WbGys6tevrypVqkiSxo0bpwMHDig2Nlbe3t6qWbOmKfMpjnXr1unIkSNFCs4qVqyo48eP68MPP9RDDz1kcyw2NlYeHh7KzMws4ZECAHB3IpQCAOAWEhYWpn/+859atGiRPDw8rO0rV65UUFDQdf8yHBsbqxo1asjPz0/x8fGaO3eu3Nzc7OrKlCmjdu3alcr4HaWon9u//vUvfffdd/rwww/VpUsXm2ORkZHKzc21u0aTJk0KDPqu58iRI5Kk0aNHq0aNGkU+Pz9//PGHypcvf92awMBAVatWzfr+ySef1KhRo9SpUyc9+uij+vbbb60BWf369fMdd/369fX000/btbdp08a6cupmGYahrKysfH+vOoKvr68qVqyo2NhYm1Dq3Llz+te//qWnn35aK1ascOAIAQC4c/D4HgAAt5CnnnpKkhQfH29ty8jI0MaNGzV06NACzztw4ICOHDmi8PBwPfPMM9ZzStqiRYvUsWNH1ahRQxUqVFDTpk01Z84cXb582aauc+fOatKkiT799FMFBwerfPnyqlevnl599VW7wOfrr79W9+7dVb58eVWrVk0jRozI9xGz6ynq53bmzBlJKnCVT5kyJfMjUp06dTRx4kRJkpeXlywWi6ZOnSpJys3N1Zw5c9SoUSO5uLioRo0aGjhwoP773//a9JH3We7Zs0ft27dX+fLlr/t74XqaN2+uCRMmKDU1VQkJCdb2qx/fO3HihCwWi3bu3KmjR4/aPKZosVj03Xff6d1337W25z1ylpmZqb/97W+qW7eunJ2ddc8992js2LG6cOGCzRgsFotGjRqlpUuXyt/fXy4uLlq9erUk6dixY+rfv79q1KghFxcX+fv7a9GiRTbn540jPj5eEyZMUK1ateTh4aGuXbvqm2++sfnc/vOf/+jHH38s8iOqQ4cO1aZNm3T27Flr2/r16yVdCffys2/fPj300EOqWLGiypcvr/bt2+s///mPXd3HH3+sDh06yNXVVbVq1VJUVJTdn588CQkJCgoKUoUKFeTu7q5u3bopOTn5huP/8MMP1blzZ1WtWlVubm7y9fVV37599ccffxRi9gAAmIdQCgCAW4iHh4cef/xxxcbGWtvi4+NVpkwZhYWFFXjeypUrJV35y/STTz6p8uXLW9vyk52dbffKb3XQtb7//nv1799fa9eu1TvvvKNhw4bptdde03PPPWdXm56erqeffloDBgzQtm3b1KNHD0VFRemtt96y1vzyyy/q1KmTjhw5osWLF2vt2rU6f/68Ro0adcOxXK2on1tQUJAkaeDAgdqyZYs1pLqenJwcu88sJyfnuuds3rxZw4YNk3TlcbqkpCQNHz5ckvT888/r5ZdfVkhIiLZt26YZM2bovffeU/v27XX69GmbftLS0jRgwAD1799f27dvV0RExA3HW5BHH31U0pX9kfJTs2ZNJSUlqUWLFqpXr56SkpKUlJSkli1bKikpSd7e3urQoYO1vWbNmvrjjz/UqVMnrV69WqNHj9a7776rl19+WXFxcXr00Uft9mfasmWLlixZosmTJ2vHjh0KDg7WV199pdatW+vIkSN644039M4776hnz54aPXq0pk2bZjfOV155RT/++KPefPNNLV++XMeOHVOvXr2svyaLFy9Whw4d5O3tbR1rUlJSoT6jJ598Uk5OTjYh58qVK/X444/brMTLs3v3bj344IPKyMjQypUrFR8fr4oVK6pXr1424d9XX32lhx56SGfPnlVcXJyWLl2q5ORk/f3vf7frc9asWXrqqacUEBCgDRs2aO3atTp37pz1sypI3p5fzs7Oio2N1XvvvadXX31VFSpUsD7eCwDALcMAAAAOt2rVKkOS8emnnxofffSRIck4cuSIYRiG0bp1a2Pw4MGGYRhG48aNjU6dOtmce+HCBcPDw8No166dtW3QoEGGxWIxvvvuO5vaQYMGGZLyfT300ENFGnNOTo5x+fJlY82aNYaTk5Px22+/WY916tTJkGQcOHDA5pyAgACjW7du1vcvv/yyYbFYjJSUFJu6kJAQQ5Lx0UcfXXcMN/O5TZ8+3XB2drbOv27dusaIESOMw4cP53uN/F5OTk43/JymTJliSDJ+/fVXa9vRo0cNSUZERIRN7YEDBwxJxiuvvGJty/ssP/jggxteq6DrXe3PP/80JBk9evSwtg0aNMjw8/OzqevUqZPRuHFju/P9/PyMnj172rRFR0cbZcqUMT799FOb9n//+9+GJGP79u3WNkmGp6enze8XwzCMbt26GbVr1zYyMjJs2keNGmW4urpa6/N+nR9++GGbug0bNhiSjKSkJGtbz5497eZ1PVfPedCgQUarVq0MwzCML7/80pBk7Nq1y/j0008NScaqVaus57Vr186oUaOGce7cOWtbdna20aRJE6N27dpGbm6uYRiGERYWZri5uRnp6ek2dY0aNTIkGcePHzcMwzBSU1ONsmXLGi+88ILN+M6dO2d4e3sb/fr1s7bl/XrnyfvMr/0zBQDArYiVUgAA3GI6deqk+vXrKzY2Vl988YU+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cnJyslsVderUKbvVU9dKSEjQsGHDtGHDBnXt2tXmWPXq1bVlyxZduHBBP/74o77++mu5u7vbPOrw4osvavz48XryySfVtGlThYeHa9y4cYXexwoAgKIaMmSIVq1aZX0fGxuroUOH2tUlJCTovvvu03333acBAwZo1apVuhW2GHdoKDV37lwNGzZMw4cPl7+/v2JiYuTj42OzKeXVWrRooaeeekqNGzdWnTp1NGDAAHXr1s1mdVVMTIxCQkIUFRWlRo0aKSoqSg899BDP8gMAANwFnJ2dFRgYqMTERJv2xMREtW/fvsDz4uPjNXjwYK1bt049e/YssM7V1VX33HOPsrOztXHjRvXu3dt67I8//lCZMrY/Xjs5OSk3N7eYswEA4PrCw8O1b98+nThxQj/++KP+7//+TwMGDLCrW7lypbW9e/fuOn/+vD744AO7uvbt28vd3d3mlZOTU2rjd9hG5yWxCWVycrL279+vv//979a2pKQkjRs3zqauW7duhFIAAAB3icjISIWHh6tVq1YKCgrS8uXLlZqaqhEjRkiSoqKidPLkSa1Zs0bSlUBq4MCBmj9/vtq1a2ddZeXm5iZPT09J0oEDB3Ty5Endf//9OnnypKZOnarc3Fy99NJL1uv26tVLM2fOlK+vrxo3bqzk5GTNnTs333+xBgCgJFSrVk09e/bU6tWrZRiGevbsqWrVbDdO/+abb/TJJ59YH/MrW7aswsLCFBsba7cyOCEhQf7+/jZtVz+qXtIcFkrdzCaUtWvX1q+//qrs7GxNnTpVw4cPtx5LT08vcp8XL17UxYsXre8zMzOLMhUAAADcQsLCwnTmzBlNnz5daWlpatKkibZv3y4/Pz9JUlpams12EcuWLVN2drZGjhypkSNHWtuv/tairKwsTZw4UT/88IPc3d318MMPa+3atapUqZK1fuHChZo0aZIiIiJ06tQp1apVS88995wmT55syrwBAHenoUOHatSoUZKkRYsW2R1fuXKlsrOzdc8991jbDMNQuXLl9Pvvv6ty5crWdh8fHzVo0KD0B/3/OSyUylOcTSj37t2r8+fP6+OPP9b48ePVoEEDm281KWqf0dHRmjZtWjFGDwAAgFtRRESEIiIi8j127eauu3btumF/nTp10ldffXXdmooVKyomJoYV+gAAU3Xv3l2XLl2SdOVJsatlZ2drzZo1euON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QWPHjtWECROUnJys4OBg9ejRQ6mpqfnW79mzRyEhIdq+fbsOHTqkLl26qFevXkpOTrap8/DwUFpams3L1dXVenz48OFKTEzU2rVr9cUXXyg0NFRdu3bVyZMnS3W+AAAAwN3IYhiG4ehB3GoyMzPl6empjIwMeXh4OHo4AHDXadu2rVq2bKklS5ZY2/z9/dWnTx9FR0cXqo/GjRsrLCxMkydPlnRlpdTYsWN19uzZfOv//PNPVaxYUVu3blXPnj2t7ffff78eeeQR/f3vfy/+hIC71KvJpx09hLvW+BbVHD0EAMBdrLC5CiulAAC3lEuXLunQoUMKDQ21aQ8NDdX+/fsL1Udubq7OnTunKlWq2LSfP39efn5+ql27th555BGblVTZ2dnKycmxWTklSW5ubtq3b18xZwMAAG43jthCoE6dOvnWjBw5stTmCdwKCKVQahxxM5ekkydPasCAAapatarKly+v+++/X4cOHSqVOQIoeadPn1ZOTo68vLxs2r28vJSenl6oPt544w1duHBB/fr1s7Y1atRIcXFx2rZtm+Lj4+Xq6qoOHTro2LFjkqSKFSsqKChIM2bM0M8//6ycnBy99dZbOnDggNLS0kpuggAA4JblqC0EPv30U5tjiYmJkqQnnnii9CYL3AIIpVAqHHUz//3339WhQweVK1dO7777rr766iu98cYbqlSpUmlOF0ApsFgsNu8Nw7Bry098fLymTp2qhIQE1ahRw9rerl07DRgwQM2bN1dwcLA2bNige++9VwsXLrTWrF27VoZh6J577pGLi4sWLFig/v37y8nJqeQmBgAAbllz587VsGHDNHz4cPn7+ysmJkY+Pj42WwpcLSYmRi+99JJat26thg0batasWWrYsKHefvttmzqLxSJvb2+b19WqV69uc+ydd95R/fr11alTp1KbK3ArKOvoAeDOdPXNXLpys96xY4eWLFmS734wMTExNu9nzZqlrVu36u2331aLFi2s7Xk384LMnj1bPj4+WrVqlbWtTp06NzcZAKaqVq2anJyc7FZFnTp1ym711LUSEhI0bNgw/etf/1LXrl2vW1umTBm1bt3aulJKkurXr6/du3frwoULyszMVM2aNRUWFqa6desWf0IAAOC2kLeFwPjx423aS3ILgZycHN1///2aMWOGzd9zrh3HW2+9pcjIyEL9gxxwO2OlFEqc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fft23XvvvXJzc1OXLl104sQJu+vt379fHTt2lJubm3x8fDR69GhduHChwPFNnTpVvr6+cnFxUa1atTR69OibnzQAAEAhEEoBAACUsiFDhmjVqlXW97GxsRo6dKhNzUsvvaSNGzdq9erV+uyzz9SgQQN169ZNv/32myTpp59+0l/+8hc9/PDDSklJ0fDhwzV+/HibPr744gt169ZNf/nLX/T5558rISFB+/bt06hRo/Id17///W/NmzdPy5Yt07Fjx7RlyxY1bdq0hGcPAACQP0IpAACAUhYeHq59+/bpxIkT+vHHH/V///d/GjBggPX4hQsXtGTJEr322mvq0aOHAgICtGLFCrm5uWnlypWSpCVLlqhevXqaN2+e7rvvPj399NN2+1G99tpr6t+/v8aOHauGDRuqffv2WrBggdasWaOsrCy7caWmpsrb21tdu3aVr6+v2rRpo2eeeaZUPwsAAIA8hFIAAAClrFq1aurZs6dWr16tVatWqWfPnqpWrZr1+Pfff6/Lly+rQ4cO1rZy5cqpTZs2Onr0qCTp6NGjateunSwWi7UmKCjI5jqHDh1SXFyc3N3dra9u3bopNzdXx48ftxvXE088oT///FP16tXTM888o82bNys7O7ukpw8AAJCvso4eAAAAwN1g6NCh1sfoFi1aZHPMMAxJsgmc8trz2vJqric3N1fPPfdcvvtC5bepuo+Pj7755hslJiZq586dioiI0Guvvabdu3erXLlyhZsYAABAMbFSCgAAwATdu3fXpUuXdOnSJXXr1s3mWIMGDeTs7Kx9+/ZZ2y5fvqyDBw/K399fkhQQEKCPP/7Y5rxr37ds2VJffvmlGjRoYPdydnbOd1xubm569NFHtWDBAu3atUtJSUn64osvSmLKAAAA18VKKQAAABM4OTlZH8VzcnKyOVahQgU9//zzevHFF1WlShX5+vpqzpw5+uOPPzRs2DBJ0ogRI/TGG28oMjJSzz33nPVRvau9/PLLateunUaOHKlnnnlGFSpU0NGjR5WYmKiFCxfajSkuLk45OTlq27atypcvr7Vr18rNzU1+fn6l8yEAAABchZVSAAAAJvHw8JCHh0e+x1599VX17dtX4eHhatmypb777jvt2LFDlStXlnTl8buNGzfq7bffVvPmzbV06VLNmjXLpo9mzZpp9+7dOnbsmIKDg9WiRQtNmjRJNWvWzPealSpV0ooVK9ShQwc1a9ZMH3zwgd5++21VrVq1ZCcOAACQD4tRmA0KAAAAAAAAgBLESikAAAAAAACYjlAKAAAAAAAApiOUAgAAAAAAgOkIpQAAAAAAAGA6QikAAAAAAACYjlAKAAAAAAAApiOUAgAAAAAAgOkIpQAAAAAAAGA6QikAAAAAAACYjlAKAAAAAAAApiOUAgAAAAAAgOkIpQAAAAAAAGC6/wffTkxdcjjTPgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(12, 6))\n",
    "\n",
    "# Define bar width and positions\n",
    "bar_width = 0.35\n",
    "r1 = np.arange(len(ettm2_eval.columns) - 1)\n",
    "r2 = [x + bar_width for x in r1]\n",
    "\n",
    "# Create bars\n",
    "mae_bars = ax.bar(r1, ettm2_eval.iloc[0, 1:], color='skyblue', width=bar_width, label='MAE')\n",
    "mse_bars = ax.bar(r2, ettm2_eval.iloc[1, 1:], color='lightgreen', width=bar_width, label='MSE')\n",
    "\n",
    "# Add value labels on top of bars\n",
    "def add_value_labels(bars):\n",
    "    for bar in bars:\n",
    "        height = bar.get_height()\n",
    "        ax.text(bar.get_x() + bar.get_width()/2., height,\n",
    "                f'{height:.3f}',\n",
    "                ha='center', va='bottom')\n",
    "\n",
    "add_value_labels(mae_bars)\n",
    "add_value_labels(mse_bars)\n",
    "\n",
    "# Customize the plot\n",
    "ax.set_xlabel('Models')\n",
    "ax.set_ylabel('Error')\n",
    "ax.set_title('MAE and MSE for Different Models')\n",
    "ax.set_xticks([r + bar_width/2 for r in range(len(ettm2_eval.columns) - 1)])\n",
    "ax.set_xticklabels(ettm2_eval.columns[1:])\n",
    "ax.legend()\n",
    "\n",
    "# Adjust layout and display the plot\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "neuralforecast",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
